-use std::io::{fs, UserRWX};
use std::collections::HashSet;
+use std::dynamic_lib::DynamicLibrary;
+use std::io::{fs, UserRWX};
+use std::os;
use semver::Version;
use core::{Package, PackageId, PackageSet, Target, Resolve};
// be building a C lib for a plugin
let layout = cx.layout(false);
let output = layout.native(pkg);
- let mut p = process(cmd.next().unwrap(), pkg)
+ let mut p = process(cmd.next().unwrap(), pkg, cx)
.env("OUT_DIR", Some(&output))
.env("DEPS_DIR", Some(&output))
.env("TARGET", cx.config.target());
fn prepare_rustc(package: &Package, target: &Target, crate_types: Vec<&str>,
cx: &Context, req: PlatformRequirement) -> Vec<ProcessBuilder> {
- let base = process("rustc", package);
+ let base = process("rustc", package, cx);
let base = build_base_args(base, target, crate_types.as_slice());
let target_cmd = build_plugin_args(base.clone(), cx, false);
}
}
-pub fn process<T: ToCStr>(cmd: T, pkg: &Package) -> ProcessBuilder {
+pub fn process<T: ToCStr>(cmd: T, pkg: &Package, cx: &Context) -> ProcessBuilder {
+ // When invoking a tool, we need the *host* deps directory in the dynamic
+ // library search path for plugins and such which have dynamic dependencies.
+ let mut search_path = DynamicLibrary::search_path();
+ search_path.push(cx.layout(false).deps().clone());
+ let search_path = os::join_paths(search_path.as_slice()).unwrap();
+
util::process(cmd)
.cwd(pkg.get_root())
+ .env(DynamicLibrary::envvar(), Some(search_path.as_slice()))
.env("CARGO_PKG_VERSION_MAJOR", Some(pkg.get_version().major.to_string()))
.env("CARGO_PKG_VERSION_MINOR", Some(pkg.get_version().minor.to_string()))
.env("CARGO_PKG_VERSION_PATCH", Some(pkg.get_version().patch.to_string()))
--- /dev/null
+use std::os;
+use std::path;
+
+use support::{project, execs, basic_bin_manifest};
+use support::{RUNNING, COMPILING};
+use hamcrest::{assert_that, existing_file};
+use cargo::util::process;
+
+fn setup() {
+}
+
+test!(plugin_to_the_max {
+ let foo = project("foo")
+ .file("Cargo.toml", r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies.bar]
+ path = "../bar"
+ "#)
+ .file("src/main.rs", r#"
+ #![feature(phase)]
+ #[phase(plugin)] extern crate bar;
+
+ fn main() {}
+ "#);
+ let bar = project("bar")
+ .file("Cargo.toml", r#"
+ [package]
+ name = "bar"
+ version = "0.0.1"
+ authors = []
+
+ [[lib]]
+ name = "bar"
+ plugin = true
+
+ [dependencies.baz]
+ path = "../baz"
+ "#)
+ .file("src/lib.rs", r#"
+ #![feature(plugin_registrar)]
+
+ extern crate rustc;
+ extern crate baz;
+
+ use rustc::plugin::Registry;
+
+ #[plugin_registrar]
+ pub fn foo(reg: &mut Registry) {
+ println!("{}", baz::baz());
+ }
+ "#);
+ let baz = project("baz")
+ .file("Cargo.toml", r#"
+ [package]
+ name = "baz"
+ version = "0.0.1"
+ authors = []
+
+ [[lib]]
+ name = "baz"
+ crate_type = ["dylib"]
+ "#)
+ .file("src/lib.rs", "pub fn baz() -> int { 1 }");
+ bar.build();
+ baz.build();
+
+ assert_that(foo.cargo_process("cargo-build"),
+ execs().with_status(0));
+})